LA GUA PERFECTA PARA COMENZAR A CRACKEAR    BY ANTIKTON    MAY-98   VOLUMEN 1
=========================================    ===========    ======   =========

INDICE
------
    0. NOTA DEL AUTOR.
    1. GUIA DE ENSAMBLADOR (ASM) ENFOCADA AL CRACKING.
    2. CONFIGURACIN Y USO DE SOFTICE.
    3. NUESTRO PRIMER CRACKING.
    4. URLs.
    5. CIERRE DE EDICIN.

 --------------------
| 0. NOTA DEL AUTOR. |
 -------------------- -------------------------------------------------------
 Hiz, soy Antikton y voy a intentar explicaros cmo se crackea; pero antes
 voy a dejar unos puntos claros:

    1.- Si no tienes ni puta idea de lo que es crackear, mejor que dejes de
    leer este fichero y lo borres.

    2.- Si sabes lo que es pero no tienes ni puta idea de programacin (lo
    que se dice nada de nada) y crees que vas a poder estar crackeando
    programas comerciales en unos minutos, gilipollas!!! t te crees que esto
    es coser y cantar???

    3.- Perdonad si me equivoco al escribir o slo pongo los signos al final
    (como los ingleses) pero es la economizacin del lenguaje.

    4.- Si tienes unos poquillos conocimientos de programacin y te gustara
    crackear, te felicito porque has dado con el manual adecuado (digo yo)
    pero necesitars dos o tres meses para empezar a crackear t solito :)

    5.- NOTA: Este documento con la informacin que en l aparece, es slo
    para uso de aprendizaje. El autor no se hace responsable de lo que la
    gente ahga con ello. ;)

    6.- Bueno, comenzemos a crackear X)

    El curso va a estar enfocado en crackear programas para Windows 95/98 de
    esos que piden un password o que piden un nombre y un cdigo ( o sea, la
    mayora :)

 -------------------------------------------
| 1. GUA DE ASEMBLER ENFOCADA AL CRACKING. |
 ------------------------------------------- --------------------------------
Antes de nada, si no sabes lo que es ASM o lo que es un Looping o un
FOR...NEXT, etc. te recomiendo que dejes de leer este manual ya que no tienes
el nivel suficente para leerlo :P

REGISTROS (Registers)
---------------------
Los registros son bsicamente sitios por defecto en dnde se guardan datos.
Los nicos por los que os tenis que preocupar son: (E)AX, (E)BX, (E)CX y
(E)DX.  (La (E) slo es para cuando se debuguea en cdigo de 32 bit)
Tambien estn los registros de parejas:
    DS:SI  ;  pueden ser usados como fuente (origen) para operaciones de
    cadenas.
    ES:DI  ;  usado como el destino para las operaciones de cadenas.

Entender los registros no es muy importante para crackear, pero lo que si
tienes que saber es que son variables para el almacenamiento de datos :)

FLAGS
-----
Los Flags son esencialmente como los registros excepto que los Flags slo
pueden contener valores especficos, como verdadero o falso (1 o 0), etc.
Los flags son calculados por comandos como CMP y son usados para comprobar
el resultado de una llamada (CALL), por ejemplo:
    CMP AX,BX            ; compara AX con BX, si son iguales el Flag 0 cambia
    JZ  00124531         ; si el flag 0 ha cambiado, salta a 00124531, si no
                           continua

LA PILA (STACK) Y LOS PUSH AND POP (PONER Y QUITAR)
---------------------------------------------------
Antes de cualquier funcin de llamada (a partir de ahora CALL), un programa
debe PONER (a partir de ahora de diremos PUSH) unos parmetros que la funcin
espera encontrar en la pila (tcnicamente llamado Stack). Los datos se colocan
de una manera especial. Piensa lo siguiente. Piensalo como si fuera una "pila"
(stack) de platos, el primer plato que ponemos (a l hacer un montn) se queda
abajo y ser el ltimo en coger; y el ltimo en poner (el de arriba), es el
primero en coger.
Recuerda esto cuando ests sobre una CALL, los parmetros son cogidos en orden
inverso. Te pongo un ejemplo para que te quede claro:
    La funcin API de Windows GetDlgItemTextA requiere los siguientes
    parmetros:
        (1) Manejo de la ventana de dilogo (Handle Dialgo Box)
        (2) Identificador del Control
        (3) Direccin del Buffer del Texto
        (4) Tamao mximo de la cadena
    Por tanto, esto puede ser pasado de este modo (de forma inversa, para
    luego cogerlo ordenadamente):
        MOV  EDI,[ESP+00000220]       ; Coge en EDI el Handle Dialog Box
        PUSH 00000100                 ; PUSH (4) - Tamao mximo de la cadena
        PUSH 00406130                 ; PUSH (3) - Direccin buffer de texto
        PUSH 00000405                 ; PUSH (2) - Identificador de Control
        PUSH EDI                      ; PUSH (1) - Handle Dialog Box
        CALL GetWindowText            ; Llama (CALL) a la funcion GetWin...

Facil, no? esto ser importantea la hora de crackear aplicaciones que piden
nmeros de serie.
Si conocemos la direccin del buffer para nuestro nmero de serie (es decir,
dnde se encuentra almacenado el nmero que le hemos metido en la memoria),
en este caso 00406130, slo hay que hacer un breakpoint y normalmente
terminaremos alrededor del procedimiento que genera el nmero de serie bueno.

POP se usa para borrar el primer "plato" de la pila. Normalmente, despus de
hacer uns PUSH y haber una llamada, se colocan varios POP para borrar los
datos innecesarios.

AND
---
 - Uso: AND dest, orig
 - Fin: Lleva a cabo una operacin de tipo AND de las dos entradas,
        reemplazando el dest con el resultado.
 - Ejemplo: AND BX, 03h
    No hay mucho que decir. Esto es importante para cuando necesitemos hacer
    un generador de nmeros de serie para un programa :)

CALL (Llamada)
--------------
 - Uso: CALL address (direccin)
 - Fin: Ejecuta una funcin en la direccin "address"
 - Ejemplo: CALL 10284312
    Una vez que la funcin termine, el cdigo contina en la lnea siguiente
    de CALL (es como un GOSUB)

CMP
---
 - Uso: CMP dest, orig
 - Fin: Resta el orig del dest y actualiza en Flag
 - Ejemplo: CMP AX, 03h
    Esta instruccin es muy importante para nosotros (los crackers) :)
    Est colocado muchas veces en el programa para verificar algo; por ejemplo
    que el nmero de serie que introducimos es el mismo que el que tiene el
    programa o genera ;)

INT (Interrupcin)
------------------
 - Uso: INT interrupcin
 - Fin: Llama a una funcin general (normalmente de la BIOS)
 - Ejemplo: INT 10h
    Esta funcin es muy comn en programas de DOS, pero no lo veremos mucho
    ya que me voy a dedicar (como he dicho antes) al Cracking en W95.
    Normalmente los parmetros son guardados en los registros por defecto (AX,
    BX, CX, ...)

JMP (Salto)
-----------
 - Uso: JMP direccin
 - Fin: Equivale a un GOTO. Salta a la seccin de cdigo de la direccin.
 - Ejemplo: JMP 00402011
    JMP es un salto incondicional. Tan simple como un GOTO :)
    Hay muchas variantes. Las ms importantes son:
        JZ  o JE   - Salta si el Flag 0 es cambiado
        JNZ o JNE  - Salta si el Falg 0 no es modificado
    Normalmente estn despus de uns intruccin de CMP, por ejemplo:
        CMP numseriebueno, numseriemalo   ; compara los nm. de serie
        JNE fueradeaki                    ; si no son iguales, salta a otra
                                            parte del cdigo

MOV (Mover)
-----------
 - Uso: MOV dest, orig
 - Fin: Copia el byte o el valor de la palabra desde el orig al dest
 - Ejemplo: MOV AX, DX
    Lo vers muy a menudo cuando ests stepping (ejecutando lnea por lnea.
    una cosa, a lo mejor me confundo y lo llamo stepting o steping, pero me
    refiero a esto, pa cuando lo veis).
    MOV es como si fuera   LET dest=orig
    Hay algunas variantes como MOVSX, pero es raro.

RET (Retorno)
-------------
 - Uso: RET
 - Fin: Para volver de una funcin (Como si fuera RETURN)
 - Ejemplo: RET
    Normalmente lo vers el final de una funcin, y slo dice que vuelva a
    la direccin de la llamada (CALL) para continuar.

LEA (Como LET)
--------------
 - Uso: LEA dest, orig
 - Fin: Hace que el dest sea igual que el orig
 - Ejemplo: LEA EAX, [EBP-34]
    Hace que EAX=EBP-34, facil, no?

 ------------------------------------
| 2. CONFIGURACIN Y USO DE SOFTICE. |
 ------------------------------------ ---------------------------------------
Contenido:
    2.1. Configuracin de SoftIce
    2.2. Uso y teclas de SofIce
    2.3. Comandos importantes para el Cracking

2.1. CONFIGURACIN DE SOFTICE
-----------------------------
Para comenzar a usar SoftIce para Windows 95 (gracias a NuMega), tenemos que
ver si se cargan las libreras; para ello comprueba que el fichero WINICE.DAT
en el apartado "Examples of export symbols that can be included for Chicago"
no tengan delante el punto y coma, y verifica que las rutas de los ficheros
a tu windows sean correctas.
Si quieres tener menos memoria ocupada, quita los puntos y comas slo a
KERNEL32.DLL, USER32.DLL y GDI32.DLL que son los ms importantes.
Lgicamente tendrs que reiniciar el ordenador y volver a cargar SoftIce.

2.2. USO Y TECLAS DE SOFTICE
----------------------------
La pantalla de SoftIce es parecida a la siguiente (por lo menos en la ver. 2,
porque la v3.2 cambia):
     -------------------
    | Ventana Registros | R - editar ; Aqui estn los valores de los registros
    |-------------------|              
    |  Ventana  Datos   | D - ver  E - editar  ; Es dnde vemos la memoria
    |-------------------|                        hex. y dec. y la direccin
    |  Ventana Cdigo   | U - ver  A - Inserta ; Vemos el cdigo en ASM
    |-------------------|                        conforme se va ejecutando
    | Ventana  Comandos |            ; Aqui pondremos los comandos
     -------------------
Otras teclas importantes son:
    F5 / Ctrl+D  -> Ejecuta
    F10          -> Paso a Paso
    F11          -> Funcin en Funcin
    t            -> traza una llamada

2.3. COMANDOS PARA EL CRACKING
------------------------------
Bueno, para explicar los comandos que ms usaremos (que son muy pocos) voy a
deciros el proceso genrico para el cracking de un programa.
Bien, resulta que cuando a un programa le damos a la opcin del menu REGISTER
(aparece en muchos programas), sale una ventana que nos pide, por ejemplo, el
nombre y el cdigo.
Pues nuestra tarea ser interceptar el lugar en donde el programa compara
nuestro cdigo con el generado por l mismo para comprobar si es correcto o
errneo.
Facil, eh? pues s, los programas sencillos s.
Primera pregunta, cmo interceptar cundo el programa recoge dichos datos?
Para ello hay que colocar un BreakPoint.
Un BP sirve para detener el programa y ver el cdigo ASM en la funcin que
nosotros le digamos.
Por ejemplo que se detenga cuando recoga el cdigo que introducimos.
Las dos funciones ms usadas para recoger las cadenas que introducimos son:
    GetDlgItemTextA   y   GetWindowTextA

Bueno, para ver cmo se usa y cmo se crackea (que es el tema que nos ocupa)
pasemos al siguiente apartado.

 -----------------------------
| 3. NUESTRO PRIMER CRACKING. | (from ED!SON tutorial)
 ----------------------------- ----------------------------------------------
Antes de arrancar W95 o W98, tenemos que arrancar en DOS y ejecutar WINICE
el cual se encargara de arrancar el Windows.

3.1. PROTECCIN POR NMERO
--------------------------
 - Target: Task Lock 3.00
 - Protection Type: Una simple proteccin de introduzca un nmero
 - Tool Needed: SoftIce 2.0 o sup.

* PASO 1: Ejecutar el programa TaskLock ;)
* PASO 2: Buscar la opcin REGISTER. Introducir un nmero al azar y pulsar OK.
* PASO 3: Ohh! no es correcto :(  (todava)  ;)
* PASO 4: Volver a poner un nmero y antes de pulsar Ok hay que colocar un
          BreakPoint (BP)
          Para ello pasaremos a SoftIce pulsando Ctrl+D y pondremos:
          BPX GetWindowTextA
          pulsamos ENTER y saldremos de SoftIce pulsando de nuevo Ctrl+D
          y ahora s,
          pulsamos OK y...
          :(
* PASO 5: ein! otra vez ese estpido mensaje de nmero incorrecto !!!
          Bueno, est claro que la funcin que usa para coger el nmero no
          es GetWindowTextA
          Bueno, ponemos otra vez el numerito y pulsamos de nuevo Ctrl+D
          Ahora borraremos el BrakPoint de antes que no vale para nada con
          el comando
          BC 0   (es 0 porque es el primero. Si tuviramos varios BP,
          podramos listarlos con BL y ver el nmero que es, en nuestro caso,
          con BL pondra  00)  BPX USER32!GetWindowsTextA C=01
          Bueno, ahora probaremos con
          BPX GetDlgItemTextA
          damos a enter y salimos (Ctrl+D)
          pulsamos OK y...
          :)
* PASO 6: Bingo!!! ahora estamos dentro de SoftIce :)
          Estamos al comienzo de la funcin GetDlgItemTextA, pero para ver
          desde dnde es llamada pulsamos
          F11
          Ahora debes desconectar el BP, pon
          bd 0  (si necesitas activarlo despus, que no lo necesitaremos
                es be 0)
* PASO 7: La priemta lnea que aparece es:
          CALL   [USER32!GetDlgItemTextA]
          Pro qu hay antes??
          Para ello pulsaremos unas cuantas veces CTRL+flechaarriba hasta ver
          lo siguiente:

          RET                             ; final de la func. anterior
          PUSH EBP                        ; comienzo de la funcion
          MOV  EBP, ESP                   ; ...
          SUB  ESP, 0000009C              ; ...
          PUSH ESI                        ; ...
        > LEA  EAX, [EBP-34]              ; EAX=EBP-34
          PUSH EDI                        ; ...
          MOVE ESI, ECX                   ; ...
          PUSH 32                         ; Guarda: la long. mx.
        > PUSH EAX                        ; Guarda: direccin del buffer :)
          PUSH 000003F4                   ; Guarda: ...
          PUSH DWORD PTR [ESI+1C]         ; Guarda: ...
          CALL [USER32!GetDlgItemTextA]   ; coge el texto y comienza la func.

        Los PUSH, como dije, son para guardar valores para su uso posterior :)
        Las lneas importantes les he puesto un > delante; observmoslas.
        Vemos que el buffer de texto se guarda en EAX y cunto vale EAX?
        EAX=EBP-34
        Bien, ahora ponemos   d ebp-34   para ver la memoria en ese valor.
        Jeje, vemos en la ventana de Datos el nmero que hemos puesto :)

*PASO 8: Ahora, lo que hay que hacer es buscar dnde se hace la comparacin
         entre nuestro cdigo y el cdigo bueno. Para ello hay que ir paso por
         paso de instrucciones pulsando F10 hasta encontrar algo relacionado
         con EBP-34 (que es en dnde est nuestro nmero). Tras unos pocos F10
         nos encontramos lo siguiente:

          > LEA  EAX, [EBP+FFFFFF64]      ; EAX=EBP-9C
            LEA  ECX, [EBP-34]            ; ECX=EBP-34 (Ahora nuestro nmero
            PUSH EAX                      ; Guarda EAX.           est en ECX)
            PUSH ECX                      ; Guarda ECX
          > CALL 00403DD0                 ; Llama a una funcin
            ADD  ESP, 08                  ; ...
            TEST EAX, EAX                 ; Chequea el resultado de la funcion
            JNZ 00402BC0                  ; Salta si no es 0

         Yo veo claramente cmo se recoge una variable en EAX, otra en ECX
         (nuestro nmero), se llama a una funcin ( que suponemos que es la
         que genera el nmero bueno) y despus es comparada.

         Bien, entonces que se esconde bajo EAX (EBP+FFFFFF64) ? pues s, el
         nmero correcto. Ponemos
         D EAX
         y aparecer el numerito en la ventana de Datos ;)
         Ahora lo que tenemos que hacer es ponerle dicho numerito en el
         programa cuando lo pida y y esta :)

 ----------
| 4. URLs. |
 ---------- -----------------------------------------------------------------
Tengo que decir que dentro de poco har un hueco en internet para ayudaros
a los problemillas que tengis.
La URL ser http://members.tripod.com/~antikton/cracking/

Bueno, ahora os pongo las URLs de los programas que he usado:
    - SoftIce:  Busca en http://astalavista.box.sk
                o dentro de poco en mi pgina web.
    - TaskLock: Busca en http://www.filez.com
                o en otro buscador de FTP
                o dentro de poco en mi web.

 -----------------------
| 5. CIERRE DE EDICIN. |
 ----------------------- ----------------------------------------------------
Bueno, en este primer nmero hemos aprendido asembler (enfocado al cracking),
el manejo de SoftIce y a crackear un programa basado en proteccin por
nmero. No est mal para ser el pimer nmero, pero ya iremos progresando poco
a poco y a vir si alguien me ehca una mano (antikton@rocketmail.com)
En prximos nmeros iremos aprendiendo a manejar editores hexadecimales, a
tracear para crear generadores de nmeros de serie y crackear programas ms
complejos (poco a poco).

Si no habis entendido algo (porque no me haya expresado bien) o necesitis
cualquier cosa, o tenis una sugerencia o lo que sea (dar nimos para que
saquemos el siguiente numero, si no, no lo saco), hzmelo saber mandndome
un e-mail a

antikton@rocketmail.com

                                        byez ;)

Web   : http://antikton.home.ml.org
e-mail: antikton@rocketmail.com
